﻿#pragma once
/**
@author 何炜
@date 2010/07/29
@brief .
@details
*/

namespace GLL
{
	typedef uint Property_t;

	typedef HashMap<Property_t, GLL_Any> PropertyMap;

	/**属性用map来管理的类
	*/
	class ObjectProperty
	{
	protected:
		PropertyMap _Props;
		virtual void OnPropertyChanged(Property_t){}

	public:
		ObjectProperty();
		virtual ~ObjectProperty();

		/**
		@remarks 属性 0 必须是 空值
		@param ip_i 属性
		@param ipv_i 属性对应值
		*/
		void SetPropVal(Property_t ip_i, const GLL_Any& ipv_i);

		/**得到属性
		@param ip_i 属性
		*/
		template<typename ValType>
		const ValType GetPropVal(Property_t ip_i)
		{
			PropertyMap::iterator iter = _Props.find(ip_i);
			if(iter == _Props.end()){
				return ValType();
			}
			GLL_Any& any = iter->second;
			ValType vt = GLL_Anycast<ValType>(any);
			return vt;
		}

		/**复制属性
		@param prop_i 属性集
		*/
		void CpyPropVal(const PropertyMap& prop_i);
	};

};
